suppressPackageStartupMessages({
library(Seurat)
library(org.Dr.eg.db)
library(BSgenome.Drerio.UCSC.danRer11)
library(Signac)
library(knitr)
library(kableExtra)
library(dplyr)
library(ggplot2)
library(ggsci)
library(limma)
library(JASPAR2020)
library(patchwork)
library(TFBSTools)
library(motifmatchr)
library(AnnotationHub)
library(harmony)
})
options(future.globals.maxSize = 4000 * 1024^2)
mypal <- pal_igv(palette = "default",alpha = 1)(30)
2. Read data
HB13hpf <- readRDS(file = "RDSfiles/HB13hpf_neural.RDS")
DefaultAssay(HB13hpf) <- "SCT"
Idents(HB13hpf) <- "Clusters"
HB16hpf <- readRDS(file = "RDSfiles/HB16hpf_neural.RDS")
DefaultAssay(HB16hpf) <- "SCT"
Idents(HB16hpf) <- "Clusters"
HB.int <- readRDS(file = "RDSfiles/int.neural.3WT.subset.RDS")
DefaultAssay(HB.int) <- "SCT"
DimPlot(HB.int, reduction = "wnn.umap") + scale_color_igv()

HB.int$intClusters <- as.character(HB.int$intClusters)
HB.int$intClusters[HB.int$intClusters %in% c("r1&r2.1","r1&r2.2")] <- "r1&r2"
HB.int$intClusters[HB.int$intClusters %in% c("r3.1")] <- "r3"
HB.int$intClusters[HB.int$intClusters %in% c("r4.1","r4.2")] <- "r4"
HB.int$intClusters[HB.int$intClusters %in% c("r5.1","r5.2")] <- "r5"
HB.int$intClusters[HB.int$intClusters %in% c("r6.1","r6.2")] <- "r6"
HB.int$intClusters <- droplevels(as.factor(HB.int$intClusters))
Idents(HB.int) <- "intClusters"
levels(HB.int)
[1] "CaudHB.1" "CaudHB.2" "CaudHB.3" "CaudHB.4" "Ciliated" "HB" "MB.1"
[8] "MB.2" "MB.3" "MHB.1" "MHB.2" "MHB.3" "MHB.4" "MHB.5"
[15] "MHB.6" "Mitochondrial" "NC.1" "NC.2" "Neurog" "Neuron.1" "Neuron.2"
[22] "r1" "r1&r2" "r2" "r3" "r4" "r5" "r6"
[29] "SC.1" "SC.2" "SC.3" "SC.4"
levels(HB.int) <- c("r1","r1&r2","r2","r3","r4","r5","r6","CaudHB.1","CaudHB.2","CaudHB.3","CaudHB.4","Ciliated","HB","MB.1","MB.2",
"MB.3","MHB.1","MHB.2","MHB.3","MHB.4","MHB.5","MHB.6","Mitochondrial","NC.1","NC.2","Neurog","Neuron.1",
"Neuron.2","SC.1","SC.2","SC.3","SC.4")
3. Heatmaps
3.1 HB13hpf top5 DE genes
All.markers.13 <- FindAllMarkers(HB13hpf, only.pos = T, verbose = F)
top5.pval.13 <- All.markers.13 %>% group_by(cluster) %>% top_n(n=-5, wt = p_val) %>% top_n(n=5, wt = avg_log2FC)
top5.pval.13
Idents(HB13hpf) <- "Clusters"
HB13hpf <- RenameIdents(HB13hpf, "FB.1" = "FB.1 ")
heatmapPlot.13 <- DoHeatmap(HB13hpf, features = unique(top5.pval.13$gene), group.colors = mypal,
size = 5, angle = 45) +
guides(color = FALSE) +
theme(axis.text = element_blank())
heatmapPlot.13

3.2 HB16hpf top5 DE genes
All.markers.16 <- FindAllMarkers(HB16hpf, only.pos = T, verbose = F)
top5.pval.16 <- All.markers.16 %>% group_by(cluster) %>% top_n(n=-5, wt = p_val) %>% top_n(n=5, wt = avg_log2FC)
top5.pval.16
heatmapPlot.16 <- DoHeatmap(HB16hpf, features = unique(top5.pval.16$gene), group.colors = mypal,
size = 5, angle = 45) +
guides(color = FALSE) +
theme(axis.text = element_blank())
heatmapPlot.16

3. Compare r1, r3 & r5 to r2, r4 and r6
r135vs246_markers <- FindMarkers(HB.int,
ident.1 = c("r1","r3","r5"),
ident.2 = c("r2","r4","r6"), verbose = FALSE)
avg_r135vs246 <- AverageExpression(HB.int, features = rownames(r135vs246_markers), assays = "SCT")$SCT
avg_r135vs246 <- as.data.frame(avg_r135vs246) %>%
select(r1, r2, r3, r4, r5, r6)
r135vs246_m_avg <- cbind(r135vs246_markers,avg_r135vs246)
r135over246_m_avg <- r135vs246_m_avg %>%
filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r1 > 0 & r3 > 0 & r5 > 0)
r135over246_m_avg
r246over135_m_avg <- r135vs246_m_avg %>%
filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r2 > 0 & r4 > 0 & r6 > 0)
r246over135_m_avg
3.1 r1/r3/r5 over r2/r4/r6
p135 <- VlnPlot(HB.int, features = rownames(r135over246_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
idents = c("r1","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
theme(axis.title.x = element_blank())
p135

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
features = rownames(r135over246_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
kable_classic_2(full_width = F)
| |
r1 |
r1&r2 |
r2 |
r3 |
r4 |
r5 |
r6 |
| egr2b |
0.014 |
0.117 |
0.000 |
3.611 |
0.053 |
4.873 |
0.000 |
| epha4a |
0.348 |
0.640 |
0.687 |
10.365 |
0.773 |
9.833 |
0.222 |
| sema3fb |
0.203 |
0.883 |
0.179 |
6.476 |
0.523 |
6.683 |
0.089 |
| timp2b |
0.087 |
0.252 |
0.119 |
2.802 |
0.030 |
2.937 |
0.067 |
| nab1b |
0.101 |
0.180 |
0.060 |
1.317 |
0.114 |
1.063 |
0.100 |
| myo1cb |
0.058 |
0.009 |
0.000 |
1.048 |
0.030 |
1.262 |
0.011 |
| sema3ab |
0.014 |
0.027 |
0.015 |
0.254 |
0.008 |
1.468 |
0.033 |
| midn |
0.522 |
1.126 |
1.269 |
3.429 |
1.030 |
4.508 |
1.444 |
| gria1a |
0.014 |
0.027 |
0.045 |
0.206 |
0.008 |
1.405 |
0.067 |
| brinp2 |
0.043 |
0.054 |
0.090 |
0.849 |
0.053 |
0.810 |
0.033 |
| tenm3 |
1.246 |
1.144 |
0.657 |
1.270 |
0.742 |
2.603 |
0.978 |
| ackr3b |
0.319 |
0.351 |
0.313 |
0.810 |
0.371 |
2.571 |
0.856 |
| tox3 |
0.710 |
0.946 |
1.403 |
2.397 |
0.598 |
3.325 |
2.000 |
| epha4l |
0.319 |
0.829 |
0.552 |
1.365 |
0.561 |
2.095 |
0.856 |
| ctnnd2b |
1.014 |
0.973 |
0.970 |
1.810 |
1.212 |
2.238 |
0.589 |
| sdk2b |
0.072 |
0.198 |
0.119 |
0.675 |
0.076 |
0.683 |
0.078 |
| celf2 |
1.957 |
1.144 |
2.209 |
1.270 |
1.811 |
4.603 |
0.767 |
3.1 r2/r4/r6 over r1/r3/r5
p246 <- VlnPlot(HB.int, features = rownames(r246over135_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
idents = c("r1","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
theme(axis.title.x = element_blank())
p246

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
features = rownames(r246over135_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
kable_classic_2(full_width = F)
| |
r1 |
r1&r2 |
r2 |
r3 |
r4 |
r5 |
r6 |
| col7a1l |
0.029 |
1.216 |
0.806 |
0.246 |
2.242 |
0.246 |
1.611 |
| efnb3b |
3.478 |
3.982 |
4.149 |
0.889 |
3.765 |
1.675 |
5.478 |
| epha4b |
2.304 |
2.883 |
4.284 |
1.857 |
5.379 |
2.889 |
7.322 |
| plxna2 |
0.130 |
0.432 |
1.537 |
0.286 |
0.992 |
0.175 |
0.322 |
| ddr1 |
1.551 |
1.180 |
3.000 |
1.190 |
2.318 |
1.659 |
2.944 |
| qkib |
0.783 |
0.802 |
1.030 |
1.000 |
2.583 |
1.127 |
1.878 |
4. Compare r1 & r2 to rest
r12vsRest_markers <- FindMarkers(HB.int,
ident.1 = c("r1","r1&r2","r2"),
ident.2 = c("r3","r5","r4","r6"), verbose = FALSE)
avg_r12vsRest <- AverageExpression(HB.int, features = rownames(r12vsRest_markers), assays = "SCT")$SCT
avg_r12vsRest <- as.data.frame(avg_r12vsRest) %>%
select(r1, r2, r3, r4, r5, r6)
r12vsRest_m_avg <- cbind(r12vsRest_markers,avg_r12vsRest)
r12overRest_m_avg <- r12vsRest_m_avg %>%
filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r1 > 0 & r2 > 0)
r12overRest_m_avg
# Restoverr12_m_avg <- r12vsRest_m_avg %>%
# filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r3 > 0 & r4 > 0 & r5 > 0 & r6 > 0)
# Restoverr12_m_avg
4.1 r1/r2 over r3/r4/r5/r6
p12 <- VlnPlot(HB.int, features = rownames(r12overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
theme(axis.title.x = element_blank())
p12

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
features = rownames(r12overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
kable_classic_2(full_width = F)
| |
r1 |
r1&r2 |
r2 |
r3 |
r4 |
r5 |
r6 |
| efna2a |
8.826 |
4.288 |
2.224 |
1.556 |
1.886 |
0.817 |
0.733 |
| bmpr1ba |
3.000 |
2.369 |
2.657 |
1.198 |
1.576 |
0.778 |
1.089 |
| ek1 |
0.507 |
0.829 |
0.716 |
0.190 |
0.212 |
0.111 |
0.156 |
| nrp2a |
1.072 |
0.982 |
0.149 |
0.024 |
0.167 |
0.048 |
0.078 |
| ptprn2 |
3.246 |
1.468 |
1.821 |
0.698 |
1.091 |
0.548 |
0.822 |
| nr2f1b |
1.609 |
1.288 |
0.806 |
0.206 |
0.705 |
0.063 |
0.256 |
| rasal2 |
5.174 |
4.901 |
4.194 |
2.548 |
3.205 |
2.786 |
3.089 |
| fgfr2 |
6.232 |
5.793 |
3.851 |
2.294 |
3.667 |
2.881 |
4.467 |
| si:ch211-286o17.1 |
2.217 |
1.568 |
1.701 |
0.563 |
0.720 |
0.571 |
1.033 |
| pdzrn3b |
0.957 |
0.730 |
0.373 |
0.103 |
0.212 |
0.127 |
0.133 |
| bahcc1b |
1.333 |
2.414 |
0.985 |
0.984 |
1.447 |
0.421 |
0.556 |
| arhgap29a |
0.696 |
1.153 |
0.955 |
0.484 |
0.455 |
0.262 |
0.178 |
| ror1 |
1.290 |
2.432 |
1.552 |
1.595 |
1.303 |
0.571 |
0.367 |
4.2 r3/r4/r5/r6 over r1/r2
# VlnPlot(HB.int, features = rownames(Restoverr12_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
# idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend()
# kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
# features = rownames(Restoverr12_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
# dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
# kable_classic_2(full_width = F)
5. Compare r3 & r4 to rest
r34vsRest_markers <- FindMarkers(HB.int,
ident.1 = c("r3","r4"),
ident.2 = c("r1","r1&r2","r2","r5","r6"), verbose = FALSE)
avg_r34vsRest <- AverageExpression(HB.int, features = rownames(r34vsRest_markers), assays = "SCT")$SCT
avg_r34vsRest <- as.data.frame(avg_r34vsRest) %>%
select(r1, r2, r3, r4, r5, r6)
r34vsRest_m_avg <- cbind(r34vsRest_markers,avg_r34vsRest)
r34overRest_m_avg <- r34vsRest_m_avg %>%
filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r3 > 0 & r4 > 0)
r34overRest_m_avg
# Restoverr34_m_avg <- r34vsRest_m_avg %>%
# filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r1 > 0 & r2 > 0 & r5 > 0 & r6 > 0)
# Restoverr34_m_avg
5.1 r3/r4 over r1/r2/r5/r6
p34 <- VlnPlot(HB.int, features = rownames(r34overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
theme(axis.title.x = element_blank())
p34

kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
features = rownames(r34overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
kable_classic_2(full_width = F)
| |
r1 |
r1&r2 |
r2 |
r3 |
r4 |
r5 |
r6 |
| cyp26b1 |
0.174 |
0.802 |
1.642 |
2.190 |
3.508 |
0.151 |
0.022 |
| cntfr |
7.493 |
6.135 |
12.552 |
11.579 |
13.288 |
8.968 |
6.933 |
| epha4a |
0.348 |
0.640 |
0.687 |
10.365 |
0.773 |
9.833 |
0.222 |
| cadm4 |
0.145 |
0.288 |
0.343 |
0.659 |
1.144 |
0.167 |
0.400 |
| sema3fb |
0.203 |
0.883 |
0.179 |
6.476 |
0.523 |
6.683 |
0.089 |
5.2 r1/r2/r5/r6 over r3/r4
# VlnPlot(HB.int, features = rownames(Restoverr34_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
# idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend()
# kableExtra::kbl(as.data.frame(round(AverageExpression(HB.int, assays = "SCT", slot = "data",
# features = rownames(Restoverr34_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
# dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
# kable_classic_2(full_width = F)
6. Compare r5 & r6 to rest
r56vsRest_markers <- FindMarkers(HB.int,
ident.1 = c("r5","r6"),
ident.2 = c("r1","r1&r2","r2","r3","r4"), verbose = FALSE)
avg_r56vsRest <- AverageExpression(HB.int, features = rownames(r56vsRest_markers), assays = "SCT")$SCT
avg_r56vsRest <- as.data.frame(avg_r56vsRest) %>%
select(r1, r2, r3, r4, r5, r6)
r56vsRest_m_avg <- cbind(r56vsRest_markers,avg_r56vsRest)
r56overRest_m_avg <- r56vsRest_m_avg %>%
filter(p_val_adj < 0.05 & avg_log2FC > 0.5 & r5 > 0 & r6 > 0)
r56overRest_m_avg
# Restoverr56_m_avg <- r56vsRest_m_avg %>%
# filter(p_val_adj < 0.05 & avg_log2FC < -0.5 & r1 > 0 & r2 > 0 & r3 > 0 & r4 > 0)
# Restoverr56_m_avg
6.1 r5/r6 over r1/r2/r3/r4
p56 <- VlnPlot(HB.int, features = rownames(r56overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend() +
theme(axis.title.x = element_blank())
p56

kableExtra::kbl(as.data.frame(
round(AverageExpression(HB.int, assays = "SCT", slot = "data",
features = rownames(r56overRest_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
kable_classic_2(full_width = F)
| |
r1 |
r1&r2 |
r2 |
r3 |
r4 |
r5 |
r6 |
| hoxa4a |
0.000 |
0.072 |
0.015 |
0.000 |
0.015 |
3.778 |
2.367 |
| mafba |
0.029 |
0.144 |
0.000 |
0.016 |
0.114 |
2.865 |
3.356 |
| hoxb3a |
0.043 |
0.135 |
0.000 |
0.508 |
0.652 |
3.381 |
2.789 |
| evx1 |
0.014 |
0.036 |
0.000 |
0.016 |
0.061 |
0.825 |
0.456 |
| si:ch211-216b21.2 |
0.058 |
0.243 |
0.045 |
0.111 |
0.015 |
1.238 |
0.878 |
| tenm4 |
3.899 |
5.486 |
9.507 |
3.746 |
1.955 |
8.389 |
12.033 |
| gria1a |
0.014 |
0.027 |
0.045 |
0.206 |
0.008 |
1.405 |
0.067 |
| col11a1b |
0.072 |
0.081 |
0.119 |
0.095 |
0.114 |
0.802 |
1.489 |
| hoxd3a |
0.029 |
0.090 |
0.000 |
0.008 |
0.015 |
0.087 |
1.122 |
| ptprua |
0.101 |
0.135 |
0.179 |
0.151 |
0.106 |
2.444 |
0.411 |
| sema3ab |
0.014 |
0.027 |
0.015 |
0.254 |
0.008 |
1.468 |
0.033 |
| cyp26c1 |
0.696 |
1.018 |
1.388 |
0.302 |
0.818 |
1.802 |
5.467 |
| ackr3b |
0.319 |
0.351 |
0.313 |
0.810 |
0.371 |
2.571 |
0.856 |
| dclk2a |
0.275 |
0.270 |
0.179 |
0.548 |
0.258 |
1.175 |
1.467 |
| antxr1c |
0.101 |
0.135 |
0.075 |
0.071 |
0.114 |
0.508 |
1.000 |
| tshz3b |
0.029 |
0.045 |
0.045 |
0.063 |
0.492 |
0.929 |
0.544 |
| zgc:158328 |
0.029 |
0.117 |
0.194 |
0.087 |
0.500 |
0.738 |
1.633 |
| tiam1a |
0.594 |
1.036 |
1.119 |
0.690 |
0.848 |
2.413 |
1.400 |
| cxcl12a |
0.319 |
0.333 |
1.507 |
0.333 |
0.970 |
1.563 |
1.900 |
| nhsl1a |
0.043 |
0.216 |
0.134 |
0.111 |
0.061 |
0.460 |
0.956 |
| iqca1 |
0.101 |
0.081 |
0.030 |
0.262 |
0.045 |
0.881 |
0.289 |
| inavaa |
0.014 |
0.477 |
0.164 |
0.635 |
0.485 |
2.143 |
1.089 |
| tox3 |
0.710 |
0.946 |
1.403 |
2.397 |
0.598 |
3.325 |
2.000 |
| cbfa2t2 |
0.464 |
0.135 |
0.194 |
0.452 |
0.227 |
1.135 |
0.700 |
| rarab |
0.696 |
0.811 |
0.567 |
0.825 |
1.114 |
1.675 |
1.878 |
| nck2a |
1.000 |
1.892 |
1.955 |
2.238 |
1.250 |
3.976 |
2.944 |
| nos1apa.1 |
1.855 |
1.333 |
1.493 |
1.746 |
1.485 |
2.659 |
3.700 |
| dennd5b |
0.841 |
1.000 |
1.209 |
0.524 |
0.735 |
1.849 |
2.233 |
| magi2a |
1.029 |
0.757 |
1.343 |
0.849 |
0.909 |
3.262 |
2.000 |
| map7d1a |
2.014 |
1.568 |
1.299 |
0.746 |
1.447 |
2.214 |
3.067 |
| adgrl1a |
0.420 |
1.333 |
0.507 |
0.857 |
2.394 |
2.881 |
3.378 |
| rnf165a |
0.710 |
1.216 |
0.627 |
0.984 |
1.106 |
2.302 |
1.911 |
| vat1 |
0.174 |
0.324 |
0.642 |
0.341 |
0.409 |
1.063 |
0.911 |
| col15a1b |
0.145 |
0.667 |
0.254 |
0.254 |
0.492 |
1.802 |
0.822 |
| chl1a |
0.261 |
0.297 |
0.090 |
0.111 |
0.076 |
0.310 |
1.378 |
| midn |
0.522 |
1.126 |
1.269 |
3.429 |
1.030 |
4.508 |
1.444 |
| dbn1 |
0.522 |
0.865 |
0.582 |
1.254 |
1.258 |
2.159 |
2.422 |
| dtnba |
0.696 |
0.559 |
1.940 |
1.333 |
1.803 |
2.349 |
2.400 |
| timp2b |
0.087 |
0.252 |
0.119 |
2.802 |
0.030 |
2.937 |
0.067 |
| adgrl3.1 |
0.696 |
0.730 |
0.642 |
0.849 |
0.894 |
1.786 |
1.211 |
| epha4l |
0.319 |
0.829 |
0.552 |
1.365 |
0.561 |
2.095 |
0.856 |
| ctnna2 |
0.275 |
0.324 |
0.552 |
0.349 |
0.917 |
1.119 |
1.644 |
| col12a1a |
0.391 |
0.477 |
0.448 |
0.381 |
0.348 |
0.810 |
1.911 |
| sema3fb |
0.203 |
0.883 |
0.179 |
6.476 |
0.523 |
6.683 |
0.089 |
| epha4a |
0.348 |
0.640 |
0.687 |
10.365 |
0.773 |
9.833 |
0.222 |
| tenm3 |
1.246 |
1.144 |
0.657 |
1.270 |
0.742 |
2.603 |
0.978 |
| jag1a |
0.130 |
0.036 |
0.045 |
0.151 |
0.045 |
0.857 |
0.333 |
6.2 r1/r2/r3/r4 over r5/r6
# VlnPlot(HB.int, features = rownames(Restoverr56_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)),
# idents = c("r1","r1&r2","r2","r3","r4","r5","r6"), stack = TRUE, flip = TRUE, fill.by = "ident", cols = mypal) + NoLegend()
# kableExtra::kbl(as.data.frame(
# round(AverageExpression(HB.int, assays = "SCT", slot = "data",
# features = rownames(Restoverr56_m_avg %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5)))$SCT,3)) %>%
# dplyr::select(r1, 'r1&r2', r2, r3, r4, r5, r6)) %>%
# kable_classic_2(full_width = F)
write.table(r135vs246_m_avg, file = "../results/rhom_DEgenes_135vs246.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r12vsRest_m_avg, file = "../results/rhom_DEgenes_12vs3456.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r34vsRest_m_avg, file = "../results/rhom_DEgenes_34vs1256.txt", sep = "\t", quote = FALSE, col.names = NA)
write.table(r56vsRest_m_avg, file = "../results/rhom_DEgenes_56vs1234.txt", sep = "\t", quote = FALSE, col.names = NA)
combined <-
(((heatmapPlot.13) +
#plot_spacer() +
(heatmapPlot.16) #+
#plot_layout(widths = c(2,0.1,2))
) /
((plot_spacer()) +
((p135 / plot_spacer() / p246 / plot_spacer() / p12 / plot_spacer() / p34) +
plot_layout(heights = c(17,0.1,6,0.1,13,0.1,5))) +
#plot_spacer() +
(p56) +
plot_layout(widths = c(3,1,1))
)) +
plot_layout(heights = c(1,1.5))
combined

ggsave(filename = "../results/Fig5_combinedPlot.png", plot = combined)
Saving 31.2 x 31.2 in image
sessionInfo()
R version 4.1.0 (2021-05-18)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS 12.3
Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats4 stats graphics grDevices datasets utils methods base
other attached packages:
[1] harmony_0.1.0 Rcpp_1.0.7 AnnotationHub_3.2.0
[4] BiocFileCache_2.2.0 dbplyr_2.1.1 motifmatchr_1.16.0
[7] TFBSTools_1.32.0 patchwork_1.1.2 JASPAR2020_0.99.10
[10] limma_3.50.3 ggsci_2.9 ggplot2_3.4.0
[13] dplyr_1.0.7 kableExtra_1.3.4 knitr_1.36
[16] Signac_1.2.1 BSgenome.Drerio.UCSC.danRer11_1.4.2 BSgenome_1.62.0
[19] rtracklayer_1.54.0 Biostrings_2.62.0 XVector_0.34.0
[22] GenomicRanges_1.46.0 GenomeInfoDb_1.30.0 org.Dr.eg.db_3.14.0
[25] AnnotationDbi_1.56.1 IRanges_2.28.0 S4Vectors_0.32.4
[28] Biobase_2.54.0 BiocGenerics_0.40.0 SeuratObject_4.0.4
[31] Seurat_4.0.1
loaded via a namespace (and not attached):
[1] rappdirs_0.3.3 SnowballC_0.7.0 scattermore_0.7
[4] R.methodsS3_1.8.1 tidyr_1.1.4 bit64_4.0.5
[7] irlba_2.3.3 DelayedArray_0.20.0 R.utils_2.11.0
[10] data.table_1.14.2 rpart_4.1-15 KEGGREST_1.34.0
[13] RCurl_1.98-1.5 generics_0.1.1 cowplot_1.1.1
[16] RSQLite_2.2.8 RANN_2.6.1 future_1.26.1
[19] bit_4.0.4 tzdb_0.2.0 spatstat.data_2.1-0
[22] webshot_0.5.4 xml2_1.3.3 httpuv_1.6.3
[25] SummarizedExperiment_1.24.0 assertthat_0.2.1 DirichletMultinomial_1.36.0
[28] xfun_0.27 hms_1.1.1 jquerylib_0.1.4
[31] evaluate_0.14 promises_1.2.0.1 fansi_0.5.0
[34] restfulr_0.0.13 caTools_1.18.2 igraph_1.2.8
[37] DBI_1.1.1 htmlwidgets_1.5.4 sparsesvd_0.2
[40] spatstat.geom_2.3-0 purrr_0.3.4 ellipsis_0.3.2
[43] annotate_1.72.0 deldir_1.0-6 MatrixGenerics_1.6.0
[46] vctrs_0.5.0 ROCR_1.0-11 abind_1.4-5
[49] cachem_1.0.6 withr_2.5.0 ggforce_0.3.3
[52] sctransform_0.3.3 GenomicAlignments_1.30.0 goftest_1.2-3
[55] svglite_2.1.0 cluster_2.1.2 ape_5.6-2
[58] lazyeval_0.2.2 seqLogo_1.60.0 crayon_1.4.2
[61] labeling_0.4.2 pkgconfig_2.0.3 slam_0.1-48
[64] tweenr_1.0.2 nlme_3.1-153 rlang_1.0.6
[67] globals_0.15.1 lifecycle_1.0.3 miniUI_0.1.1.1
[70] filelock_1.0.2 polyclip_1.10-0 matrixStats_0.61.0
[73] lmtest_0.9-38 Matrix_1.3-4 ggseqlogo_0.1
[76] zoo_1.8-9 ggridges_0.5.3 png_0.1-7
[79] viridisLite_0.4.0 rjson_0.2.20 bitops_1.0-7
[82] R.oo_1.24.0 KernSmooth_2.23-20 blob_1.2.2
[85] stringr_1.4.0 parallelly_1.32.0 readr_2.0.2
[88] CNEr_1.30.0 scales_1.2.1 memoise_2.0.0
[91] magrittr_2.0.1 plyr_1.8.6 ica_1.0-2
[94] zlibbioc_1.40.0 compiler_4.1.0 BiocIO_1.4.0
[97] RColorBrewer_1.1-2 fitdistrplus_1.1-6 Rsamtools_2.10.0
[100] cli_3.4.1 listenv_0.8.0 pbapply_1.5-0
[103] MASS_7.3-54 mgcv_1.8-38 tidyselect_1.1.1
[106] stringi_1.7.5 highr_0.9 yaml_2.2.1
[109] ggrepel_0.9.1 grid_4.1.0 sass_0.4.0
[112] fastmatch_1.1-3 tools_4.1.0 future.apply_1.8.1
[115] parallel_4.1.0 rstudioapi_0.13 TFMPvalue_0.0.8
[118] lsa_0.73.2 gridExtra_2.3 farver_2.1.0
[121] Rtsne_0.15 digest_0.6.28 BiocManager_1.30.19
[124] shiny_1.7.1 pracma_2.3.3 qlcMatrix_0.9.7
[127] BiocVersion_3.14.0 later_1.3.0 RcppAnnoy_0.0.19
[130] httr_1.4.2 colorspace_2.0-2 rvest_1.0.3
[133] XML_3.99-0.8 tensor_1.5 reticulate_1.22
[136] splines_4.1.0 uwot_0.1.10 RcppRoll_0.3.0
[139] spatstat.utils_2.2-0 renv_0.15.5 plotly_4.10.0
[142] systemfonts_1.0.4 xtable_1.8-4 jsonlite_1.7.2
[145] poweRlaw_0.70.6 R6_2.5.1 pillar_1.6.4
[148] htmltools_0.5.2 mime_0.12 glue_1.6.2
[151] fastmap_1.1.0 BiocParallel_1.28.0 interactiveDisplayBase_1.32.0
[154] codetools_0.2-18 utf8_1.2.2 lattice_0.20-45
[157] bslib_0.3.1 spatstat.sparse_2.0-0 tibble_3.1.6
[160] curl_4.3.2 leiden_0.3.9 gtools_3.9.2
[163] GO.db_3.14.0 survival_3.2-13 rmarkdown_2.11
[166] docopt_0.7.1 munsell_0.5.0 GenomeInfoDbData_1.2.7
[169] reshape2_1.4.4 gtable_0.3.0 spatstat.core_2.3-0
LS0tCnRpdGxlOiAiRmlndXJlIDUgUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgbGlicmFyaWVzLCByZXN1bHRzPUZ9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShTZXVyYXQpCiAgbGlicmFyeShvcmcuRHIuZWcuZGIpCiAgbGlicmFyeShCU2dlbm9tZS5EcmVyaW8uVUNTQy5kYW5SZXIxMSkKICBsaWJyYXJ5KFNpZ25hYykKICBsaWJyYXJ5KGtuaXRyKQogIGxpYnJhcnkoa2FibGVFeHRyYSkKICBsaWJyYXJ5KGRwbHlyKQogIGxpYnJhcnkoZ2dwbG90MikKICBsaWJyYXJ5KGdnc2NpKQogIGxpYnJhcnkobGltbWEpCiAgbGlicmFyeShKQVNQQVIyMDIwKQogIGxpYnJhcnkocGF0Y2h3b3JrKQogIGxpYnJhcnkoVEZCU1Rvb2xzKQogIGxpYnJhcnkobW90aWZtYXRjaHIpCiAgbGlicmFyeShBbm5vdGF0aW9uSHViKQogIGxpYnJhcnkoaGFybW9ueSkKfSkKb3B0aW9ucyhmdXR1cmUuZ2xvYmFscy5tYXhTaXplID0gNDAwMCAqIDEwMjReMikKYGBgCgpgYGB7ciBteXBhbH0KbXlwYWwgPC0gcGFsX2lndihwYWxldHRlID0gImRlZmF1bHQiLGFscGhhID0gMSkoMzApCmBgYAoKIyAyLiBSZWFkIGRhdGEKCmBgYHtyfQpIQjEzaHBmIDwtIHJlYWRSRFMoZmlsZSA9ICJSRFNmaWxlcy9IQjEzaHBmX25ldXJhbC5SRFMiKQpEZWZhdWx0QXNzYXkoSEIxM2hwZikgPC0gIlNDVCIKSWRlbnRzKEhCMTNocGYpIDwtICJDbHVzdGVycyIKSEIxNmhwZiA8LSByZWFkUkRTKGZpbGUgPSAiUkRTZmlsZXMvSEIxNmhwZl9uZXVyYWwuUkRTIikKRGVmYXVsdEFzc2F5KEhCMTZocGYpIDwtICJTQ1QiCklkZW50cyhIQjE2aHBmKSA8LSAiQ2x1c3RlcnMiCmBgYAoKYGBge3J9CkhCLmludCA8LSByZWFkUkRTKGZpbGUgPSAiUkRTZmlsZXMvaW50Lm5ldXJhbC4zV1Quc3Vic2V0LlJEUyIpCkRlZmF1bHRBc3NheShIQi5pbnQpIDwtICJTQ1QiCkRpbVBsb3QoSEIuaW50LCByZWR1Y3Rpb24gPSAid25uLnVtYXAiKSArIHNjYWxlX2NvbG9yX2lndigpCmBgYAoKYGBge3J9CkhCLmludCRpbnRDbHVzdGVycyA8LSBhcy5jaGFyYWN0ZXIoSEIuaW50JGludENsdXN0ZXJzKQpIQi5pbnQkaW50Q2x1c3RlcnNbSEIuaW50JGludENsdXN0ZXJzICVpbiUgYygicjEmcjIuMSIsInIxJnIyLjIiKV0gPC0gInIxJnIyIgpIQi5pbnQkaW50Q2x1c3RlcnNbSEIuaW50JGludENsdXN0ZXJzICVpbiUgYygicjMuMSIpXSA8LSAicjMiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNC4xIiwicjQuMiIpXSA8LSAicjQiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNS4xIiwicjUuMiIpXSA8LSAicjUiCkhCLmludCRpbnRDbHVzdGVyc1tIQi5pbnQkaW50Q2x1c3RlcnMgJWluJSBjKCJyNi4xIiwicjYuMiIpXSA8LSAicjYiCkhCLmludCRpbnRDbHVzdGVycyA8LSBkcm9wbGV2ZWxzKGFzLmZhY3RvcihIQi5pbnQkaW50Q2x1c3RlcnMpKQpJZGVudHMoSEIuaW50KSA8LSAiaW50Q2x1c3RlcnMiCmxldmVscyhIQi5pbnQpCmBgYAoKYGBge3J9CmxldmVscyhIQi5pbnQpIDwtIGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiwiQ2F1ZEhCLjEiLCJDYXVkSEIuMiIsIkNhdWRIQi4zIiwiQ2F1ZEhCLjQiLCJDaWxpYXRlZCIsIkhCIiwiTUIuMSIsIk1CLjIiLAogICAgICAgICAgICAgICAgICAgICJNQi4zIiwiTUhCLjEiLCJNSEIuMiIsIk1IQi4zIiwiTUhCLjQiLCJNSEIuNSIsIk1IQi42IiwiTWl0b2Nob25kcmlhbCIsIk5DLjEiLCJOQy4yIiwiTmV1cm9nIiwiTmV1cm9uLjEiLCAKICAgICAgICAgICAgICAgICAgICAiTmV1cm9uLjIiLCJTQy4xIiwiU0MuMiIsIlNDLjMiLCJTQy40IikKYGBgCgojIDMuIEhlYXRtYXBzCgojIyAzLjEgSEIxM2hwZiB0b3A1IERFIGdlbmVzCmBgYHtyIG1hcmtlcnMuMTMsIHJlc3VsdHM9Rn0KQWxsLm1hcmtlcnMuMTMgPC0gRmluZEFsbE1hcmtlcnMoSEIxM2hwZiwgb25seS5wb3MgPSBULCB2ZXJib3NlID0gRikKYGBgCgpgYGB7ciB0b3A1LjEzfQp0b3A1LnB2YWwuMTMgPC0gQWxsLm1hcmtlcnMuMTMgJT4lIGdyb3VwX2J5KGNsdXN0ZXIpICU+JSB0b3BfbihuPS01LCB3dCA9IHBfdmFsKSAlPiUgdG9wX24obj01LCB3dCA9IGF2Z19sb2cyRkMpCnRvcDUucHZhbC4xMwpgYGAKCmBgYHtyIGhlYXRtYXAuMTMsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTd9CklkZW50cyhIQjEzaHBmKSA8LSAiQ2x1c3RlcnMiCkhCMTNocGYgPC0gUmVuYW1lSWRlbnRzKEhCMTNocGYsICJGQi4xIiA9ICJGQi4xICAgICAgICIpICMjIHRoaXMgbWFrZXMgdGhlIGxlbmd0aCBvZiBsb25nZXN0IG5hbWUgc2FtZSBhcyBIQjE2aHBmIHNvIHRoZXkgZXZlbiBpbiBjb21iaW5lZCBwbG90CmhlYXRtYXBQbG90LjEzIDwtIERvSGVhdG1hcChIQjEzaHBmLCBmZWF0dXJlcyA9IHVuaXF1ZSh0b3A1LnB2YWwuMTMkZ2VuZSksIGdyb3VwLmNvbG9ycyA9IG15cGFsLCAKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA1LCBhbmdsZSA9IDQ1KSArIAogIGd1aWRlcyhjb2xvciA9IEZBTFNFKSArCiAgdGhlbWUoYXhpcy50ZXh0ID0gZWxlbWVudF9ibGFuaygpKQpoZWF0bWFwUGxvdC4xMwpgYGAKCiMjIDMuMiBIQjE2aHBmIHRvcDUgREUgZ2VuZXMKYGBge3IgbWFya2Vycy4xNiwgcmVzdWx0cz1GfQpBbGwubWFya2Vycy4xNiA8LSBGaW5kQWxsTWFya2VycyhIQjE2aHBmLCBvbmx5LnBvcyA9IFQsIHZlcmJvc2UgPSBGKQpgYGAKCmBgYHtyIHRvcDUuMTZ9CnRvcDUucHZhbC4xNiA8LSBBbGwubWFya2Vycy4xNiAlPiUgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIHRvcF9uKG49LTUsIHd0ID0gcF92YWwpICU+JSB0b3BfbihuPTUsIHd0ID0gYXZnX2xvZzJGQykKdG9wNS5wdmFsLjE2CmBgYAoKYGBge3IgaGVhdG1hcC4xNiwgZmlnLmhlaWdodD03LCBmaWcud2lkdGg9N30KaGVhdG1hcFBsb3QuMTYgPC0gRG9IZWF0bWFwKEhCMTZocGYsIGZlYXR1cmVzID0gdW5pcXVlKHRvcDUucHZhbC4xNiRnZW5lKSwgZ3JvdXAuY29sb3JzID0gbXlwYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDUsIGFuZ2xlID0gNDUpICsgCiAgZ3VpZGVzKGNvbG9yID0gRkFMU0UpICsKICB0aGVtZShheGlzLnRleHQgPSBlbGVtZW50X2JsYW5rKCkpCmhlYXRtYXBQbG90LjE2CmBgYAoKIyAzLiBDb21wYXJlIHIxLCByMyAmIHI1IHRvIHIyLCByNCBhbmQgcjYKYGBge3IgbWFya2VyczEzNX0KcjEzNXZzMjQ2X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoSEIuaW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoInIxIiwicjMiLCJyNSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoInIyIiwicjQiLCJyNiIpLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKYGBge3IgYXZnMTM1fQphdmdfcjEzNXZzMjQ2IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTM1dnMyNDZfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IxMzV2czI0NiA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMTM1dnMyNDYpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMTM1dnMyNDZfbV9hdmcgPC0gY2JpbmQocjEzNXZzMjQ2X21hcmtlcnMsYXZnX3IxMzV2czI0NikKYGBgCgoKYGBge3IgdGFibGUxMzV9CnIxMzVvdmVyMjQ2X21fYXZnIDwtIHIxMzV2czI0Nl9tX2F2ZyAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPiAwLjUgJiByMSA+IDAgJiByMyA+IDAgJiByNSA+IDApCnIxMzVvdmVyMjQ2X21fYXZnCmBgYAoKYGBge3IgdGFibGUyNDZ9CnIyNDZvdmVyMTM1X21fYXZnIDwtIHIxMzV2czI0Nl9tX2F2ZyAlPiUKICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPCAtMC41ICYgcjIgPiAwICYgcjQgPiAwICYgcjYgPiAwKQpyMjQ2b3ZlcjEzNV9tX2F2ZwpgYGAKCiMjIDMuMSByMS9yMy9yNSBvdmVyIHIyL3I0L3I2CmBgYHtyIHZsbjEzNSwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NX0KcDEzNSA8LSBWbG5QbG90KEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTM1b3ZlcjI0Nl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSwgCiAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwMTM1CmBgYAoKYGBge3Iga2FibGUxMzV9CmthYmxlRXh0cmE6OmtibChhcy5kYXRhLmZyYW1lKHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAogICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IHJvd25hbWVzKHIxMzVvdmVyMjQ2X21fYXZnICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGFicyhhdmdfbG9nMkZDKSA+IDAuNSkpKSRTQ1QsMykpICU+JQogIGRwbHlyOjpzZWxlY3QocjEsICdyMSZyMicsIHIyLCByMywgcjQsIHI1LCByNikpICU+JQogIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgojIyAzLjEgcjIvcjQvcjYgb3ZlciByMS9yMy9yNQpgYGB7ciB2bG4yNDYsIGZpZy53aWR0aD02LCBmaWcuaGVpZ2h0PTV9CnAyNDYgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjI0Nm92ZXIxMzVfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKcDI0NgpgYGAKCmBgYHtyIGthYmxlMjQ2fQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZShyb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyMjQ2b3ZlcjEzNV9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKCiMgNC4gQ29tcGFyZSByMSAmIHIyIHRvIHJlc3QKYGBge3IgbWFya2VyczEyfQpyMTJ2c1Jlc3RfbWFya2VycyA8LSBGaW5kTWFya2VycyhIQi5pbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygicjEiLCJyMSZyMiIsInIyIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygicjMiLCJyNSIsInI0IiwicjYiKSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCmBgYHtyIGF2ZzEyfQphdmdfcjEydnNSZXN0IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMTJ2c1Jlc3RfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IxMnZzUmVzdCA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMTJ2c1Jlc3QpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMTJ2c1Jlc3RfbV9hdmcgPC0gY2JpbmQocjEydnNSZXN0X21hcmtlcnMsYXZnX3IxMnZzUmVzdCkKYGBgCgoKYGBge3IgdGFibGUxMn0KcjEyb3ZlclJlc3RfbV9hdmcgPC0gcjEydnNSZXN0X21fYXZnICU+JQogIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYXZnX2xvZzJGQyA+IDAuNSAmIHIxID4gMCAmIHIyID4gMCkKcjEyb3ZlclJlc3RfbV9hdmcKYGBgCgpgYGB7ciB0YWJsZTM0NTZ9CiMgUmVzdG92ZXJyMTJfbV9hdmcgPC0gcjEydnNSZXN0X21fYXZnICU+JQojICAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDIDwgLTAuNSAmIHIzID4gMCAmIHI0ID4gMCAmIHI1ID4gMCAmIHI2ID4gMCkKIyBSZXN0b3ZlcnIxMl9tX2F2ZwpgYGAKCiMjIDQuMSByMS9yMiBvdmVyIHIzL3I0L3I1L3I2CmBgYHtyIHZsbjEyLCBmaWcud2lkdGg9NCwgZmlnLmhlaWdodD04fQpwMTIgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjEyb3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwMTIKYGBgCgpgYGB7ciBrYWJsZTEyfQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZShyb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyMTJvdmVyUmVzdF9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKIyMgNC4yIHIzL3I0L3I1L3I2IG92ZXIgcjEvcjIKYGBge3IgdmxuMzQ1NiwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9OH0KIyBWbG5QbG90KEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhSZXN0b3ZlcnIxMl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSwgCiMgICAgICAgICBpZGVudHMgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkKYGBgCgpgYGB7ciBrYWJsZTM0NTZ9CiMga2FibGVFeHRyYTo6a2JsKGFzLmRhdGEuZnJhbWUocm91bmQoQXZlcmFnZUV4cHJlc3Npb24oSEIuaW50LCBhc3NheXMgPSAiU0NUIiwgc2xvdCA9ICJkYXRhIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhSZXN0b3ZlcnIxMl9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKIyAgIGRwbHlyOjpzZWxlY3QocjEsICdyMSZyMicsIHIyLCByMywgcjQsIHI1LCByNikpICU+JQojICAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQpgYGAKCiMgNS4gQ29tcGFyZSByMyAmIHI0IHRvIHJlc3QKYGBge3IgbWFya2VyczM0fQpyMzR2c1Jlc3RfbWFya2VycyA8LSBGaW5kTWFya2VycyhIQi5pbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygicjMiLCJyNCIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoInIxIiwicjEmcjIiLCJyMiIsInI1IiwicjYiKSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCmBgYHtyIGF2ZzM0fQphdmdfcjM0dnNSZXN0IDwtIEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgZmVhdHVyZXMgPSByb3duYW1lcyhyMzR2c1Jlc3RfbWFya2VycyksIGFzc2F5cyA9ICJTQ1QiKSRTQ1QKYXZnX3IzNHZzUmVzdCA8LSBhcy5kYXRhLmZyYW1lKGF2Z19yMzR2c1Jlc3QpICU+JQogIHNlbGVjdChyMSwgcjIsIHIzLCByNCwgcjUsIHI2KQpyMzR2c1Jlc3RfbV9hdmcgPC0gY2JpbmQocjM0dnNSZXN0X21hcmtlcnMsYXZnX3IzNHZzUmVzdCkKYGBgCgpgYGB7ciB0YWJsZTM0fQpyMzRvdmVyUmVzdF9tX2F2ZyA8LSByMzR2c1Jlc3RfbV9hdmcgJT4lCiAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDID4gMC41ICYgcjMgPiAwICYgcjQgPiAwKQpyMzRvdmVyUmVzdF9tX2F2ZwpgYGAKCmBgYHtyIHRhYmxlMTI1Nn0KIyBSZXN0b3ZlcnIzNF9tX2F2ZyA8LSByMzR2c1Jlc3RfbV9hdmcgJT4lCiMgICBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGF2Z19sb2cyRkMgPCAtMC41ICYgcjEgPiAwICYgcjIgPiAwICYgcjUgPiAwICYgcjYgPiAwKQojIFJlc3RvdmVycjM0X21fYXZnCmBgYAojIyA1LjEgcjMvcjQgb3ZlciByMS9yMi9yNS9yNgpgYGB7ciB2bG4zNCwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9NX0KcDM0IDwtIFZsblBsb3QoSEIuaW50LCBmZWF0dXJlcyA9IHJvd25hbWVzKHIzNG92ZXJSZXN0X21fYXZnICU+JSBmaWx0ZXIocF92YWxfYWRqIDwgMC4wNSAmIGFicyhhdmdfbG9nMkZDKSA+IDAuNSkpLCAKICAgICAgICBpZGVudHMgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiwicjUiLCJyNiIpLCBzdGFjayA9IFRSVUUsIGZsaXAgPSBUUlVFLCBmaWxsLmJ5ID0gImlkZW50IiwgY29scyA9IG15cGFsKSArIE5vTGVnZW5kKCkgKwogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKcDM0CmBgYAoKYGBge3Iga2FibGUzNH0Ka2FibGVFeHRyYTo6a2JsKGFzLmRhdGEuZnJhbWUocm91bmQoQXZlcmFnZUV4cHJlc3Npb24oSEIuaW50LCBhc3NheXMgPSAiU0NUIiwgc2xvdCA9ICJkYXRhIiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMocjM0b3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiAgZHBseXI6OnNlbGVjdChyMSwgJ3IxJnIyJywgcjIsIHIzLCByNCwgcjUsIHI2KSkgJT4lCiAga2FibGVfY2xhc3NpY18yKGZ1bGxfd2lkdGggPSBGKQpgYGAKCiMjIDUuMiByMS9yMi9yNS9yNiBvdmVyIHIzL3I0CmBgYHtyIHZsbjEyNTYsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTV9CiMgVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyMzRfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAojICAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMSZyMiIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiKSwgc3RhY2sgPSBUUlVFLCBmbGlwID0gVFJVRSwgZmlsbC5ieSA9ICJpZGVudCIsIGNvbHMgPSBteXBhbCkgKyBOb0xlZ2VuZCgpCmBgYAoKYGBge3Iga2FibGUxMjU2fQojIGthYmxlRXh0cmE6OmtibChhcy5kYXRhLmZyYW1lKHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyMzRfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiMgICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKIyAgIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgojIDYuIENvbXBhcmUgcjUgJiByNiB0byByZXN0CmBgYHtyIG1hcmtlcnM1Nn0KcjU2dnNSZXN0X21hcmtlcnMgPC0gRmluZE1hcmtlcnMoSEIuaW50LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoInI1IiwicjYiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJyMSIsInIxJnIyIiwicjIiLCJyMyIsInI0IiksIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgpgYGB7ciBhdmc1Nn0KYXZnX3I1NnZzUmVzdCA8LSBBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjU2dnNSZXN0X21hcmtlcnMpLCBhc3NheXMgPSAiU0NUIikkU0NUCmF2Z19yNTZ2c1Jlc3QgPC0gYXMuZGF0YS5mcmFtZShhdmdfcjU2dnNSZXN0KSAlPiUKICBzZWxlY3QocjEsIHIyLCByMywgcjQsIHI1LCByNikKcjU2dnNSZXN0X21fYXZnIDwtIGNiaW5kKHI1NnZzUmVzdF9tYXJrZXJzLGF2Z19yNTZ2c1Jlc3QpCmBgYAoKYGBge3IgdGFibGU1Nn0KcjU2b3ZlclJlc3RfbV9hdmcgPC0gcjU2dnNSZXN0X21fYXZnICU+JQogIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYXZnX2xvZzJGQyA+IDAuNSAmIHI1ID4gMCAmIHI2ID4gMCkKcjU2b3ZlclJlc3RfbV9hdmcKYGBgCgpgYGB7ciB0YWJsZTEyMzR9CiMgUmVzdG92ZXJyNTZfbV9hdmcgPC0gcjU2dnNSZXN0X21fYXZnICU+JQojICAgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhdmdfbG9nMkZDIDwgLTAuNSAmIHIxID4gMCAmIHIyID4gMCAmIHIzID4gMCAmIHI0ID4gMCkKIyBSZXN0b3ZlcnI1Nl9tX2F2ZwpgYGAKIyMgNi4xIHI1L3I2IG92ZXIgcjEvcjIvcjMvcjQKYGBge3IgdmxuNTYsIGZpZy53aWR0aD00LCBmaWcuaGVpZ2h0PTEwfQpwNTYgPC0gVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMocjU2b3ZlclJlc3RfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAogICAgICAgIGlkZW50cyA9IGMoInIxIiwicjEmcjIiLCJyMiIsInIzIiwicjQiLCJyNSIsInI2IiksIHN0YWNrID0gVFJVRSwgZmxpcCA9IFRSVUUsIGZpbGwuYnkgPSAiaWRlbnQiLCBjb2xzID0gbXlwYWwpICsgTm9MZWdlbmQoKSArCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQpwNTYKYGBgCgpgYGB7ciBrYWJsZTU2fQprYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZSgKICByb3VuZChBdmVyYWdlRXhwcmVzc2lvbihIQi5pbnQsIGFzc2F5cyA9ICJTQ1QiLCBzbG90ID0gImRhdGEiLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMgPSByb3duYW1lcyhyNTZvdmVyUmVzdF9tX2F2ZyAlPiUgZmlsdGVyKHBfdmFsX2FkaiA8IDAuMDUgJiBhYnMoYXZnX2xvZzJGQykgPiAwLjUpKSkkU0NULDMpKSAlPiUKICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKICBrYWJsZV9jbGFzc2ljXzIoZnVsbF93aWR0aCA9IEYpCmBgYAoKIyMgNi4yIHIxL3IyL3IzL3I0IG92ZXIgcjUvcjYKYGBge3IgdmxuMTIzNCwgZmlnLndpZHRoPTQsIGZpZy5oZWlnaHQ9MTB9CiMgVmxuUGxvdChIQi5pbnQsIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyNTZfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSksIAojICAgICAgICAgaWRlbnRzID0gYygicjEiLCJyMSZyMiIsInIyIiwicjMiLCJyNCIsInI1IiwicjYiKSwgc3RhY2sgPSBUUlVFLCBmbGlwID0gVFJVRSwgZmlsbC5ieSA9ICJpZGVudCIsIGNvbHMgPSBteXBhbCkgKyBOb0xlZ2VuZCgpIApgYGAKCmBgYHtyIGthYmxlMTIzNH0KIyBrYWJsZUV4dHJhOjprYmwoYXMuZGF0YS5mcmFtZSgKIyAgIHJvdW5kKEF2ZXJhZ2VFeHByZXNzaW9uKEhCLmludCwgYXNzYXlzID0gIlNDVCIsIHNsb3QgPSAiZGF0YSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzID0gcm93bmFtZXMoUmVzdG92ZXJyNTZfbV9hdmcgJT4lIGZpbHRlcihwX3ZhbF9hZGogPCAwLjA1ICYgYWJzKGF2Z19sb2cyRkMpID4gMC41KSkpJFNDVCwzKSkgJT4lCiMgICBkcGx5cjo6c2VsZWN0KHIxLCAncjEmcjInLCByMiwgcjMsIHI0LCByNSwgcjYpKSAlPiUKIyAgIGthYmxlX2NsYXNzaWNfMihmdWxsX3dpZHRoID0gRikKYGBgCgpgYGB7ciB3cml0ZX0Kd3JpdGUudGFibGUocjEzNXZzMjQ2X21fYXZnLCBmaWxlID0gIi4uL3Jlc3VsdHMvcmhvbV9ERWdlbmVzXzEzNXZzMjQ2LnR4dCIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsIGNvbC5uYW1lcyA9IE5BKQp3cml0ZS50YWJsZShyMTJ2c1Jlc3RfbV9hdmcsIGZpbGUgPSAiLi4vcmVzdWx0cy9yaG9tX0RFZ2VuZXNfMTJ2czM0NTYudHh0Iiwgc2VwID0gIlx0IiwgcXVvdGUgPSBGQUxTRSwgY29sLm5hbWVzID0gTkEpCndyaXRlLnRhYmxlKHIzNHZzUmVzdF9tX2F2ZywgZmlsZSA9ICIuLi9yZXN1bHRzL3Job21fREVnZW5lc18zNHZzMTI1Ni50eHQiLCBzZXAgPSAiXHQiLCBxdW90ZSA9IEZBTFNFLCBjb2wubmFtZXMgPSBOQSkKd3JpdGUudGFibGUocjU2dnNSZXN0X21fYXZnLCBmaWxlID0gIi4uL3Jlc3VsdHMvcmhvbV9ERWdlbmVzXzU2dnMxMjM0LnR4dCIsIHNlcCA9ICJcdCIsIHF1b3RlID0gRkFMU0UsIGNvbC5uYW1lcyA9IE5BKQpgYGAKCmBgYHtyIGNvbWJpbmVkMiwgZmlnLmhlaWdodD0yNSwgZmlnLndpZHRoPTI1fQpjb21iaW5lZCA8LSAKICAoKChoZWF0bWFwUGxvdC4xMykgKwogICAgICAjcGxvdF9zcGFjZXIoKSArCiAgICAgKGhlYXRtYXBQbG90LjE2KSAjKyAKICAgICAjcGxvdF9sYXlvdXQod2lkdGhzID0gYygyLDAuMSwyKSkKICApIC8KICAoKHBsb3Rfc3BhY2VyKCkpICsKICAgICAoKHAxMzUgLyBwbG90X3NwYWNlcigpIC8gcDI0NiAvIHBsb3Rfc3BhY2VyKCkgLyBwMTIgLyBwbG90X3NwYWNlcigpIC8gcDM0KSArIAogICAgICAgIHBsb3RfbGF5b3V0KGhlaWdodHMgPSBjKDE3LDAuMSw2LDAuMSwxMywwLjEsNSkpKSArIAogICAgICNwbG90X3NwYWNlcigpICsKICAgICAocDU2KSArCiAgICAgcGxvdF9sYXlvdXQod2lkdGhzID0gYygzLDEsMSkpCiAgKSkgKyAKICBwbG90X2xheW91dChoZWlnaHRzID0gYygxLDEuNSkpCmNvbWJpbmVkCmdnc2F2ZShmaWxlbmFtZSA9ICIuLi9yZXN1bHRzL0ZpZzVfY29tYmluZWRQbG90LnBuZyIsIHBsb3QgPSBjb21iaW5lZCkKYGBgCmBgYHtyIHNlc3Npb25pbmZvfQpzZXNzaW9uSW5mbygpCmBgYAoK